package com.ztr.suanfa.des;

import org.apache.logging.log4j.util.Base64Util;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.util.Arrays;

public class DesUtil {
	
	// 非对称加密算法  加密key 解密key  不相同
	
    /**
	 * 功能描述：DES加密方法。
	 * @param encryptString String类型 要加密的数据
	 * @param encryptKey  String类型 加密的密钥
	 * @return byte[]类型 加密后结果
	 * 
	 */
	public static byte[] encrypt(String encryptString, String encryptKey)
	{
		try
		{
			// 创建一个密匙工厂，然后用它把DESKeySpec转换成securekey
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
			DESKeySpec desKey = new DESKeySpec(encryptKey.getBytes("UTF-8"));
			SecretKey securekey = keyFactory.generateSecret(desKey);
			// Cipher对象实际完成加密操作
			Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
		     // 偏移量
			IvParameterSpec iv = new IvParameterSpec(encryptKey.getBytes("UTF-8"));   
			// 用密匙初始化Cipher对象
			cipher.init(Cipher.ENCRYPT_MODE, securekey, iv);
			// 执行加密操作
			return cipher.doFinal(encryptString.getBytes());
		} catch (Exception e){
			e.printStackTrace();
			return null;
		}
	}
	/**
	 * 功能描述：DES加密方法。
	 * base64(des(src,key))
	 * @param encryptString String类型 要加密的数据
	 * @param encryptKey  String类型 加密的密钥
	 * @return byte[]类型 加密后结果
	 * 
	 */
	public static String encryptBase64(String encryptString, String encryptKey)
	{
		try
		{
//			SecureRandom secureRandom = new SecureRandom();
			// 创建一个密匙工厂，然后用它把DESKeySpec转换成securekey
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
			DESKeySpec desKey = new DESKeySpec(encryptKey.getBytes());
			SecretKey securekey = keyFactory.generateSecret(desKey);
			// Cipher对象实际完成加密操作
			Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
			// 偏移量
			IvParameterSpec iv = new IvParameterSpec(encryptKey.getBytes());   
			// 用密匙初始化Cipher对象
			cipher.init(Cipher.ENCRYPT_MODE, securekey, iv);
			// 执行加密操作
			byte[] doFinal = cipher.doFinal(encryptString.getBytes());
			return Base64Util.encode(Arrays.toString(doFinal));
		} catch (Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
    /**
	 * 功能描述：DES解密  方法。
	 * @param decryptString byte[]类型 要解密的数据（需要使用Base64将字符串转换成byte[]）
	 * @param decryptKey String类型 解密时使用的KEY
	 * @return String类型 解密后结果
	 */
	public static byte[] decrypt(String decryptString, String decryptKey)
	{
		try
		{
			// 创建一个密匙工厂
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
			// 创建一个DESKeySpec对象
			DESKeySpec desKey = new DESKeySpec(decryptKey.getBytes("UTF-8"));
			// 将DESKeySpec对象转换成SecretKey对象
			SecretKey securekey = keyFactory.generateSecret(desKey);
			// Cipher对象实际完成解密操作
			Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
		     // 偏移量
			IvParameterSpec iv = new IvParameterSpec(decryptKey.getBytes("UTF-8")); 
			// 用密匙初始化Cipher对象
			cipher.init(Cipher.DECRYPT_MODE, securekey, iv);
			// 执行解密操作
			return cipher.doFinal(decryptString.getBytes());

		} catch (Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 功能描述：DES解密  方法。
	 * decryptBase64--->decrtpyDes
	 * @param decryptString byte[]类型 要解密的数据（需要使用Base64将字符串转换成byte[]）
	 * @param decryptKey String类型 解密时使用的KEY
	 * @return String类型 解密后结果
	 */
	public static String decryptBase64(String decryptString, String decryptKey)
	{
		try
		{
//			SecureRandom secureRandom = new SecureRandom();
			byte[] decode = Base64Util.encode(decryptString).getBytes();
			// 创建一个密匙工厂
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
			// 创建一个DESKeySpec对象
			DESKeySpec desKey = new DESKeySpec(decryptKey.getBytes());
			// 将DESKeySpec对象转换成SecretKey对象
			SecretKey securekey = keyFactory.generateSecret(desKey);
			// Cipher对象实际完成解密操作
			Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
			// 偏移量
			IvParameterSpec iv = new IvParameterSpec(decryptKey.getBytes()); 
			// 用密匙初始化Cipher对象
			cipher.init(Cipher.DECRYPT_MODE, securekey, iv);
			// 执行解密操作
			byte[] doFinal = cipher.doFinal(decode);
			System.out.println(doFinal);
			return new String(doFinal);
		} catch (Exception e){
			e.printStackTrace();
			return null;
		}
	}

	public static void main(String[] args) {
		String key = "1020457f";
		String src = "今天下雪了";
		try {
			String encryptBase64 = DesUtil.encryptBase64(src, key);
			System.out.println("DesUtil 加密 ： "+encryptBase64);
			String decryptBase64 = DesUtil.decryptBase64(encryptBase64, key);
			System.out.println("DesUtil 解密 ： "+decryptBase64);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

